package com.yazi.mxz.common.controller;

import java.awt.Color;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.patchca.color.ColorFactory;
import org.patchca.filter.predefined.CurvesRippleFilterFactory;
import org.patchca.filter.predefined.DiffuseRippleFilterFactory;
import org.patchca.filter.predefined.DoubleRippleFilterFactory;
import org.patchca.filter.predefined.MarbleRippleFilterFactory;
import org.patchca.filter.predefined.WobbleRippleFilterFactory;
import org.patchca.service.ConfigurableCaptchaService;
import org.patchca.utils.encoder.EncoderHelper;
import org.patchca.word.RandomWordFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;



@Controller("captchaController")
@RequestMapping("/captcha")
public class CaptchaController {
	private static ConfigurableCaptchaService cs = new ConfigurableCaptchaService();
	 private static Random random = new Random();
	    static {
//	        cs.setColorFactory(new SingleColorFactory(new Color(25, 60, 170)));
	        cs.setColorFactory(new ColorFactory() {
	            @Override
	            public Color getColor(int x) {
	                int[] c = new int[3];
	                int i = random.nextInt(c.length);
	                for (int fi = 0; fi < c.length; fi++) {
	                    if (fi == i) {
	                        c[fi] = random.nextInt(71);
	                    } else {
	                        c[fi] = random.nextInt(256);
	                    }
	                }
	                return new Color(c[0], c[1], c[2]);
	            }
	        });
	        RandomWordFactory wf = new RandomWordFactory();
	        wf.setCharacters("23456789abcdefghigkmnpqrstuvwxyzABCDEFGHIGKLMNPQRSTUVWXYZ");
	        wf.setMaxLength(4);
	        wf.setMinLength(4);
	        cs.setWordFactory(wf);
	    }
	    
	    @RequestMapping("/captcha.png")
	    public void crimg(HttpServletRequest request, HttpServletResponse response) throws IOException {
	        switch (random.nextInt(5)) {
	            case 0:
	                cs.setFilterFactory(new CurvesRippleFilterFactory(cs.getColorFactory()));
	                break;
	            case 1:
	                cs.setFilterFactory(new MarbleRippleFilterFactory());
	                break;
	            case 2:
	                cs.setFilterFactory(new DoubleRippleFilterFactory());
	                break;
	            case 3:
	                cs.setFilterFactory(new WobbleRippleFilterFactory());
	                break;
	            case 4:
	                cs.setFilterFactory(new DiffuseRippleFilterFactory());
	                break;
	        }
	       
	        setResponseHeaders(response);
	        Subject currentUser = SecurityUtils.getSubject();
			Session session = currentUser.getSession();
	        String token = EncoderHelper.getChallangeAndWriteImage(cs, "png", response.getOutputStream());
	        session.setAttribute("captcha", token);
	        //System.out.println("当前的SessionID=" + session.getId() + "，验证码=" + token);
	    }
	    
	    @RequestMapping("/check")
	    @ResponseBody
		public Map<String, String> check(String captcha) {
	    	String msg = null;
	        Subject currentUser = SecurityUtils.getSubject();
			Session session = currentUser.getSession();
			Object cap = session.getAttribute("captcha");
	        if (null == captcha || null == cap || !captcha.equalsIgnoreCase(String.valueOf(cap)) ) {
	        	msg = "验证码不正确";
	        }
	        Map<String, String> map = new HashMap<String, String>();
			map.put(null == msg ? "ok":"error", msg);
			return map;
	    }
	    
	    protected void setResponseHeaders(HttpServletResponse response) {
	        response.setContentType("image/png");
	        response.setHeader("Cache-Control", "no-cache, no-store");
	        response.setHeader("Pragma", "no-cache");
	        long time = System.currentTimeMillis();
	        response.setDateHeader("Last-Modified", time);
	        response.setDateHeader("Date", time);
	        response.setDateHeader("Expires", time);
	    }
}
